Daily Analysis of COVID-19 Data from Johns Hopkins University

           Updated every 6 hours. Last update: 2020-04-03 15:56 UTC

Josef Kellndorfer, Ph.D., Earth Big Data, LLC; Richard Signell, Ph.D.

Click here to share this website.

NOTE: You can hover over plots to see actual numbers.

Introduction: Population Normalization and Logarithmic Scaling

back to top
These plots show the daily status of COVID-19 cases as reported by Johns Hopkins University. We want to caveat the data analysis and interpretation:

  • Keep in mind that data are changing frequently as more Covid-19 testing (for cases and deaths) becomes more readily available globally.
  • Overall: Use your own judgement on the trustworthiness on reported data, i.e. where the data come from. (see section on Data Sources)

We chose to plot totals and numbers normalized by population (expressed as per 100,000). Also, it is advantageous to plot case totals (confirmed infections, deaths) in logarithmic scale where trends and parallels between countries become more obvious. Note, that a straight line trending upwards in logarithmic scale indicates exponential increase! Taking a close look at the plots, one will discern differences and similarities, and that for the most part initial stages are similar in all countries with a time lag. What to look out for is whether the measures taken by countries, foremost social distancing show the desired effects of slowing and eventually levelling out the exponential upwards trends. We produce plots for confirmed cases and deaths, which may be somewhat more reliable with respect to an impact for a country while tests are rolled out in larger numbers. We also plot mortality rates, 3-day change curves and doubling rates of confirmend cases and deaths.

This is work in progress, stay tuned.

You can get the notebook underlying this work at: https://github.com/EarthBigData/covid19

Interacting with the plots

back to top

Hover: See actual numbers when hovering over a plot.

Control buttons: Interact with the plots: Pan, Zoom in/out, Reset, Save.

Labels: In the legend, click on label to dim/highlight a specific country or state.

Confirmed Cases: Status for United States

back to top

Confirmed Cases: Status for Germany

back to top

Latest Confirmed Cases and Deaths Per Capita: Country Comparison

back to top

Latest Top 12 Countries Total Confirmed Cases and Deaths

back to top

Confirmed Cases: Country Comparison

back to top

Overlay: Overlay Germany

Online example: http://holoviews.org/reference/containers/bokeh/Overlay.html

---------------------
Target Specifications
---------------------

Targets in this object available for customization:

Elements:
   Curve.Curve.Germany
   Scatter.Scatter.Germany

Container: Overlay.Overlay.Germany

To see the options info for one of these target specifications,
which are of the form {type}[.{group}[.{label}]], do holoviews.help({type}).

-------------
Style Options
-------------

	background_fill_alpha, background_fill_color, border_alpha, border_color, border_hover_alpha, border_hover_color, border_hover_line_alpha, border_hover_line_color, border_line_alpha, border_line_cap, border_line_color, border_line_dash, border_line_join, border_line_width, border_muted_alpha, border_muted_color, border_muted_line_alpha, border_muted_line_color, border_nonselection_alpha, border_nonselection_color, border_nonselection_line_alpha, border_nonselection_line_color, border_selection_alpha, border_selection_color, border_selection_line_alpha, border_selection_line_color, click_policy, glyph_height, glyph_width, label_height, label_standoff, label_width, legend_padding, legend_spacing, text_align, text_alpha, text_baseline, text_color, text_font, text_font_size, text_font_style

(Consult bokeh's documentation for more information.)

------------
Plot Options
------------

The plot options are the parameters of the plotting class:

Parameters of 'OverlayPlot'
===========================

Parameters changed from their default values are marked in red.
Soft bound values are marked in cyan.
C/V= Constant/Variable, RO/RW = ReadOnly/ReadWrite, AN=Allow None

Name                                 Value                         Type         Bounds     Mode  

active_tools                           []                          List       (0, None)    V RW  
align                                 None                    ObjectSelector               V RW  
apply_extents                         True                       Boolean        (0, 1)     V RW  
apply_ranges                          True                       Boolean        (0, 1)     V RW  
aspect                                None                      Parameter                V RW AN 
batched                               True                       Boolean        (0, 1)     V RW  
bgcolor                               None                    ClassSelector              V RW AN 
border                                 10                         Number                   V RW  
data_aspect                           None                        Number                 V RW AN 
default_span                          2.0                     ClassSelector                V RW  
default_tools       ['save', 'pan', 'wheel_zoom', 'box_zo...       List       (0, None)    V RW  
finalize_hooks                         []                        HookList     (0, None)    V RW  
fontsize                       {'title': '12pt'}                Parameter                V RW AN 
frame_height                          None                       Integer      (0, None)  V RW AN 
frame_width                           None                       Integer      (0, None)  V RW AN 
gridstyle                              {}                          Dict                    V RW  
height                                300                        Integer      (0, None)  V RW AN 
hooks                                  []                        HookList     (0, None)    V RW  
invert_axes                          False                       Boolean        (0, 1)     V RW  
invert_xaxis                         False                       Boolean        (0, 1)     V RW  
invert_yaxis                         False                       Boolean        (0, 1)     V RW  
labelled                           ['x', 'y']                      List       (0, None)    V RW  
legend_cols                          False                       Integer                   V RW  
legend_limit                           25                        Integer                   V RW  
legend_muted                         False                       Boolean        (0, 1)     V RW  
legend_offset                        (0, 0)                    NumericTuple                V RW  
legend_position                   'top_right'                 ObjectSelector               V RW  
lod                 {'factor': 10, 'interval': 300, 'thre...       Dict                    V RW  
logx                                 False                       Boolean        (0, 1)     V RW  
logy                                 False                       Boolean        (0, 1)     V RW  
margin                                None                      Parameter                V RW AN 
max_height                            None                       Integer      (0, None)  V RW AN 
max_width                             None                       Integer      (0, None)  V RW AN 
min_height                            None                       Integer      (0, None)  V RW AN 
min_width                             None                       Integer      (0, None)  V RW AN 
multiple_legends                     False                       Boolean        (0, 1)     V RW  
normalize                             True                       Boolean        (0, 1)     V RW  
padding                                0                      ClassSelector                V RW  
projection                            None                      Parameter                V RW AN 
responsive                           False                    ObjectSelector               V RW  
shared_axes                           True                       Boolean        (0, 1)     V RW  
shared_datasource                     True                       Boolean        (0, 1)     V RW  
show_frame                            True                       Boolean        (0, 1)     V RW  
show_grid                            False                       Boolean        (0, 1)     V RW  
show_legend                           True                       Boolean        (0, 1)     V RW  
show_title                            True                       Boolean        (0, 1)     V RW  
style_grouping                         2                         Integer                   V RW  
tabs                                 False                       Boolean        (0, 1)     V RW  
title                    '{label} {group} {dimensions}'           String                   V RW  
title_format                          None                        String                 V RW AN 
toolbar                             'right'                   ObjectSelector               V RW  
tools                                  []                          List       (0, None)    V RW  
width                                 300                        Integer      (0, None)  V RW AN 
xaxis                               'bottom'                  ObjectSelector               V RW  
xformatter                            None                    ClassSelector              V RW AN 
xlabel                                None                        String                 V RW AN 
xlim                               (nan, nan)                     Tuple                    V RW  
xrotation                             None                       Integer       (0, 360)  V RW AN 
xticks                                None                      Parameter                V RW AN 
yaxis                                'left'                   ObjectSelector               V RW  
yformatter                            None                    ClassSelector              V RW AN 
ylabel                                None                        String                 V RW AN 
ylim                               (nan, nan)                     Tuple                    V RW  
yrotation                             None                       Integer       (0, 360)  V RW AN 
yticks                                None                      Parameter                V RW AN 
zlim                               (nan, nan)                     Tuple                    V RW  

Parameter docstrings:
=====================

active_tools:      Allows specifying which tools are active by default. Note
                   that only one tool per gesture type can be active, e.g.
                   both 'pan' and 'box_zoom' are drag tools, so if both are
                   listed only the last one will be active.
align:             Alignment (vertical or horizontal) of the plot in a layout.
apply_extents:     Whether to apply extent overrides on the Elements
apply_ranges:      Whether to compute the plot bounds from the data itself.
aspect:            The aspect ratio mode of the plot. By default, a plot may
                   select its own appropriate aspect ratio but sometimes it may
                   be necessary to force a square aspect ratio (e.g. to display
                   the plot as an element of a grid). The modes 'auto' and
                   'equal' correspond to the axis modes of the same name in
                   matplotlib, a numeric value specifying the ratio between plot
                   width and height may also be passed. To control the aspect
                   ratio between the axis scales use the data_aspect option
                   instead.
batched:           Whether to plot Elements NdOverlay in a batched plotting call
                   if possible. Disables legends and zorder may not be preserved.
bgcolor:           If set bgcolor overrides the background color of the axis.
border:            Minimum border around plot.
data_aspect:       Defines the aspect of the axis scaling, i.e. the ratio of
                   y-unit to x-unit.
default_span:      Defines the span of an axis if the axis range is zero, i.e. if
                   the lower and upper end of an axis are equal or no range is
                   defined at all. For example if there is a single datapoint at
                   0 a default_span of 2.0 will result in axis ranges spanning
                   from -1 to 1.
default_tools:     A list of plugin tools to use on the plot.
finalize_hooks:    Deprecated; use hooks options instead.
fontsize:          Specifies various fontsizes of the displayed text.
                   
                   Finer control is available by supplying a dictionary where any
                   unmentioned keys reverts to the default sizes, e.g:
                   
                      {'ticks': '20pt', 'title': '15pt', 'ylabel': '5px', 'xlabel': '5px'}
frame_height:      The height of the component (in pixels).  This can be either
                   fixed or preferred height, depending on height sizing policy.
frame_width:       The width of the component (in pixels). This can be either
                   fixed or preferred width, depending on width sizing policy.
gridstyle:         Allows customizing the grid style, e.g. grid_line_color defines
                   the line color for both grids while xgrid_line_color exclusively
                   customizes the x-axis grid lines.
height:            The height of the component (in pixels).  This can be either
                   fixed or preferred height, depending on height sizing policy.
hooks:             Optional list of hooks called when finalizing a plot. The
                   hook is passed the plot object and the displayed element, and
                   other plotting handles can be accessed via plot.handles.
invert_axes:       Whether to invert the x- and y-axis
invert_xaxis:      Whether to invert the plot x-axis.
invert_yaxis:      Whether to invert the plot y-axis.
labelled:          Whether to plot the 'x' and 'y' labels.
legend_cols:       Whether to lay out the legend as columns.
legend_limit:      Number of rendered glyphs before legends are disabled.
legend_muted:      Controls whether the legend entries are muted by default.
legend_offset:     If legend is placed outside the axis, this determines the
                   (width, height) offset in pixels from the original position.
legend_position:   Allows selecting between a number of predefined legend position
                   options. The predefined options may be customized in the
                   legend_specs class attribute.
lod:               Bokeh plots offer "Level of Detail" (LOD) capability to
                   accommodate large (but not huge) amounts of data. The available
                   options are:
                   
                     * factor    : Decimation factor to use when applying
                                   decimation.
                     * interval  : Interval (in ms) downsampling will be enabled
                                   after an interactive event.
                     * threshold : Number of samples before downsampling is enabled.
                     * timeout   : Timeout (in ms) for checking whether interactive
                                   tool events are still occurring.
logx:              Whether the x-axis of the plot will be a log axis.
logy:              Whether the y-axis of the plot will be a log axis.
margin:            Allows to create additional space around the component. May
                   be specified as a two-tuple of the form (vertical, horizontal)
                   or a four-tuple (top, right, bottom, left).
max_height:        Minimal height of the component (in pixels) if height is adjustable.
max_width:         Minimal width of the component (in pixels) if width is adjustable.
min_height:        Minimal height of the component (in pixels) if height is adjustable.
min_width:         Minimal width of the component (in pixels) if width is adjustable.
multiple_legends:  Whether to split the legend for subplots into multiple legends.
normalize:         Whether to compute ranges across all Elements at this level
                   of plotting. Allows selecting normalization at different levels
                   for nested data containers.
padding:           Fraction by which to increase auto-ranged extents to make
                   datapoints more visible around borders.
                   
                   To compute padding, the axis whose screen size is largest is
                   chosen, and the range of that axis is increased by the
                   specified fraction along each axis.  Other axes are then
                   padded ensuring that the amount of screen space devoted to
                   padding is equal for all axes. If specified as a tuple, the
                   int or float values in the tuple will be used for padding in
                   each axis, in order (x,y or x,y,z).
                   
                   For example, for padding=0.2 on a 800x800-pixel plot, an x-axis
                   with the range [0,10] will be padded by 20% to be [-1,11], while
                   a y-axis with a range [0,1000] will be padded to be [-100,1100],
                   which should make the padding be approximately the same number of
                   pixels. But if the same plot is changed to have a height of only
                   200, the y-range will then be [-400,1400] so that the y-axis
                   padding will still match that of the x-axis.
                   
                   It is also possible to declare non-equal padding value for the
                   lower and upper bound of an axis by supplying nested tuples,
                   e.g. padding=(0.1, (0, 0.1)) will pad the x-axis lower and
                   upper bound as well as the y-axis upper bound by a fraction of
                   0.1 while the y-axis lower bound is not padded at all.
projection:        Allows supplying a custom projection to transform the axis
                   coordinates during display. Example projections include '3d'
                   and 'polar' projections supported by some backends. Depending
                   on the backend custom, projection objects may be supplied.
responsive:        < No docstring available >
shared_axes:       Whether to invert the share axes across plots
                   for linked panning and zooming.
shared_datasource: Whether Elements drawing the data from the same object should
                   share their Bokeh data source allowing for linked brushing
                   and other linked behaviors.
show_frame:        Whether or not to show a complete frame around the plot.
show_grid:         Whether to show a Cartesian grid on the plot.
show_legend:       Whether to show legend for the plot.
show_title:        Whether to display the plot title.
style_grouping:    The length of the type.group.label spec that will be used to
                   group Elements into style groups.  A style_grouping value of
                   1 will group just by type, a value of 2 will group by type and
                   group, and a value of 3 will group by the full specification.
tabs:              Whether to display overlaid plots in separate panes
title:             The formatting string for the title of this plot, allows defining
                   a label group separator and dimension labels.
title_format:      Alias for title.
toolbar:           The toolbar location, must be one of 'above', 'below',
                   'left', 'right', None.
tools:             A list of plugin tools to use on the plot.
width:             The width of the component (in pixels). This can be either
                   fixed or preferred width, depending on width sizing policy.
xaxis:             Whether and where to display the xaxis.
                   The "bare" options allow suppressing all axis labels, including ticks and xlabel.
                   Valid options are 'top', 'bottom', 'bare', 'top-bare' and 'bottom-bare'.
xformatter:        Formatter for ticks along the x-axis.
xlabel:            An explicit override of the x-axis label, if set takes precedence
                   over the dimension label.
xlim:              User-specified x-axis range limits for the plot, as a tuple (low,high).
                   If specified, takes precedence over data and dimension ranges.
xrotation:         Rotation angle of the xticks.
xticks:            Ticks along x-axis specified as an integer, explicit list of
                   tick locations, or bokeh Ticker object. If set to None default
                   bokeh ticking behavior is applied.
yaxis:             Whether and where to display the yaxis.
                   The "bare" options allow suppressing all axis labels, including ticks and ylabel.
                   Valid options are 'left', 'right', 'bare', 'left-bare' and 'right-bare'.
yformatter:        Formatter for ticks along the x-axis.
ylabel:            An explicit override of the y-axis label, if set takes precedence
                   over the dimension label.
ylim:              User-specified x-axis range limits for the plot, as a tuple (low,high).
                   If specified, takes precedence over data and dimension ranges.
yrotation:         Rotation angle of the yticks.
yticks:            Ticks along y-axis specified as an integer, explicit list of
                   tick locations, or bokeh Ticker object. If set to None
                   default bokeh ticking behavior is applied.
zlim:              User-specified z-axis range limits for the plot, as a tuple (low,high).
                   If specified, takes precedence over data and dimension ranges.

Deaths Country Comparison

back to top

Confirmed Cases: U.S. States Comparison

back to top

U.S.Deaths

back to top

Cape Cod and Islands

back to top

The plots below show the confirmed cases and deaths over time on Cape Cod and the Islands compared to the trends in Massachusetts and the U.S.. To compare, the plots show numbers normalized by population (based on U.S. Census population data for 2019). The plots are shown as normalized totals and in logarithmic scale.

NOTE: In these plots we are using the sum of county populations only of affected counties in a state or across the U.S.

Cape Cod and Islands Confirmed Cases

Cape Cod and Islands Deaths

back to top

Mortality Rates Country Comparison

back to top

The plot below shows the mortality rate in percent computed as:

$Mortality=\frac{Deaths}{Infected} * 100$

A couple of caveats:

  • Because there is a timelag from infection to death, the rates computed on a daily basis might be underestimating the rate.
  • Underreporting of COVID-19 deaths is recognized by many countries with inadequate tallying systems.
  • The rates might be vastly overestimated because the lag in testing is widespread. South Korea has done the most intensive testing, hence South Korea data seem most reliable for mortality assessment.

Latest Mortality Rate

back to top

Mortality Timeline

back to top

3-Day Change in Confirmed Cases: Country Comparison

back to top

The plots below show the change of total number of confirmed cases compared to three days before the plotted date. A factor 2 means the cases doubled after three days. A factor 1 means no new confirmed cases are reported compared to three days before. (Plots also inspired by Jennifer Bardwell, Jim Bardwell).

3-Day Change in Deaths: Country Comparison

back to top

The plots below show the change of total number of deaths compared to three days before the plotted date. A factor 2 means the cases doubled after three days. A factor 1 means no new deaths are reported compared to three days before. (Plots also inspired by Jennifer Bardwell, Jim Bardwell).

Number of Days to Double Confirmed Cases: Country Comparison

back to top

The plots below show the change rate (${doubling.rate}_{confirmed.cases}$) in number of days for confirmed cases to double ($days_{confirmed.cases.double}$). This is expressed as

${doubling.rate}_{confirmed.cases} = \frac{1}{days_{confirmed.cases.double}}$

In this representation a factor of 1 means cases double every day, 0.5 means cases double every 2nd day, 0.33 means cases double every third daty, 0.25 menas cases double every 4th day, etc. When the line approaches 0, no more cases are identified.
Plots begin at more than 100 confirmed cases.
(Plots inspired by Jennifer Bardwell, Jim Bardwell).

Number of Days to Double Deaths: Country Comparison

back to top

The plots below show the change rate (${doubling.rate}_{deaths}$) in number of days for deaths to double ($days_{deaths.double}$). This is expressed as

${doubling.rate}_{deaths} = \frac{1}{days_{deaths.double}}$

In this representation a factor of 1 means death counts double every day, 0.5 means death counts double every 2nd day, 0.33 means death counts double every third day, 0.25 menas death counts double every 4th day, etc. When the line approaches 0, no more deaths are counted.
Plots begin at more than 25 deaths.
(Plots inspired by Jennifer Bardwell, Jim Bardwell).

Number of Days to Double Confirmed Cases: U.S. States Comparison

back to top

The plots below show the change rate (${doubling.rate}_{confirmed.cases}$) in number of days for confirmed cases to double ($days_{confirmed.cases.double}$). This is expressed as

${doubling.rate}_{confirmed.cases} = \frac{1}{days_{confirmed.cases.double}}$

In this representation a factor of 1 means cases double every day, 0.5 means cases double every 2nd day, 0.33 means cases double every third daty, 0.25 menas cases double every 4th day, etc. When the line approaches 0, no more cases are identified.
Plots begin at more than 100 confirmed cases.
(Plots inspired by Jennifer Bardwell, Jim Bardwell).

Number of Days to Double Deaths: U.S. States Comparison

back to top

The plots below show the change rate (${doubling.rate}_{deaths}$) in number of days for deaths to double ($days_{deaths.double}$). This is expressed as

${doubling.rate}_{deaths} = \frac{1}{days_{deaths.double}}$

In this representation a factor of 1 means death counts double every day, 0.5 means death counts double every 2nd day, 0.33 means death counts double every third day, 0.25 menas death counts double every 4th day, etc. When the line approaches 0, no more deaths are counted.
Plots begin at more than 10 deaths.
(Plots inspired by Jennifer Bardwell, Jim Bardwell).

We hope these data are informative and convey how seriously we have to take the COVID-19 pandemic. Stay safe.

Suggested Reading:

back to top

Coronavirus Interview with Larry Brilliant

Data Sources

back to top

Johns Hopkins University daily updated COVID-19 data

COVID-19 confirmed cases, deaths and recovered cases data are streamed from the The Center for Systems Science and Engineering (CSSE) at Johns Hopkins University. The CCSE COVID-19 GitHub Repo has more information about these data and their sources.

We acknowldege Sooth Sawyer who helped out by compiling the data set in the old format at: https://www.soothsawyer.com

UN Population Data

We obtain the Population data from UN statistics. UN Population Data Sets have more information about these data and their sources.

US Population Data

US population data ar obtained from US Census statistics. US Population Data Sets have more information about these data and their sources.